package main

import (
	"fmt"
	"strings"
)

func main() {

	//trimTest()
	//lenTest()
	splitJoin()
}
func lenTest() {
	str := "my 哈"
	//6 中文编码按 utf-8(字母、数字等占1字节,汉字占3字节)
	fmt.Println("len()按字节返回长度:", len(str))
	for i := 0; i < len(str); i++ {
		//m
		//y
		//
		//å
		//乱码了
		fmt.Printf("%c\n", str[i])
	}
	strRune := []rune(str)
	fmt.Println("rune 长度：", len(strRune))
	//带中文的字符串要转为 rune 处理
	for i := 0; i < len(strRune); i++ {
		fmt.Printf("%c\n", strRune[i])
	}
}

func containsTest() {
	str := "hello哈he"
	//true
	fmt.Println(strings.Contains(str, "h"))
	//tryue
	fmt.Println(strings.Contains(str, "哈"))
	//是否包含字节e :true
	fmt.Println(strings.ContainsRune(str, 'e'))
	// 包含几个子串 he :2
	fmt.Println(strings.Count(str, "he"))

	fmt.Println(strings.EqualFold("HELLO哈he", str))
}

func stringFun() {
	str := "bagayalu"
	str2 := "bagayagalu2"
	fmt.Println("len:", len(str))
	lower := strings.ToLower(str)
	i := strings.Compare(str, str2)
	prefix := strings.HasPrefix(str, "baga")
	any := strings.IndexAny(str, "ga")
	any2 := strings.Index(str, "ga")
	fmt.Println(lower)
	fmt.Println(i)
	fmt.Println(prefix)
	fmt.Println(any)
	fmt.Println(any2)

}
func indexReplace() {
	str := "hellollhaha"
	// 子串第一次出现的位置
	fmt.Println(strings.Index(str, "ll"))
	// 子串最后一次出现的位置
	fmt.Println(strings.LastIndex(str, "ll"))
	fmt.Println(strings.IndexAny(str, "l"))
	// 把 str 中的 h 替换为 哈，最后一次参数为替换的个数限制，如果匹配6个，指定2就只替换前两个，-1时表示替换全部,大于匹配数时也全部替换
	fmt.Println(strings.Replace(str, "h", "哈", 1))
}
func splitJoin() {
	str := "1,2,3,4"
	//[1 2 3 4] 按,分割
	fmt.Println(strings.Split(str, ","))
	//按,分割，但是会保留：[1, 2, 3, 4]
	fmt.Println(strings.SplitAfter(str, ","))

	//SplitAfterN
	// n == 0 返回 nil
	// n > 0 返回最多 n 个子字符串，最后一个子字符串包含未进行切割的部分
	// n < 0 返回所有子字符串包含的切片

	//[1, 2, 3, 4]
	fmt.Println(strings.SplitAfterN(str, ",", -1))
	//[]
	fmt.Println(strings.SplitAfterN(str, ",", 0))
	//[1,2,3,4] 因为只返回1个子字符串，所以不能切片，返回只包含原字符串的一个元素的数组
	fmt.Println(strings.SplitAfterN(str, ",", 1))
	//[1, 2,3,4] 返回2个子字符串
	n := strings.SplitAfterN(str, ",", 2)
	for _, a := range n {
		fmt.Println(a)
	}
	//[1, 2, 3, 4] 超过最大子字符串个数，就返回最大分割的子字符串
	fmt.Println(strings.SplitAfterN(str, ",", 6))
	arr2 := []string{"a", "b", "c"}
	join := strings.Join(arr2, ",")
	//a,b,c
	fmt.Println(join)
}

func trimTest() {
	str := " !  hello ! 哈哈 !"
	//两头只要包含指定的字符串中包含的任意 utf-8码值都去掉
	//如这里将前后的所有!和空格都去掉:"hello ! 哈哈"
	fmt.Println(strings.Trim(str, "! "))
	//只去掉前面的:"hello ! 哈哈 !"
	fmt.Println(strings.TrimLeft(str, " !"))
	//只去掉后面的:" !  hello ! 哈哈"
	fmt.Println(strings.TrimRight(str, "! "))
	// 去掉左右空格:"str hello"
	fmt.Println(strings.TrimSpace(" str hello "))
	// 去掉指定的后缀[只去掉完整的指定的后缀，不是前面那样包含任意指定的 uft-8码值都去掉]。不包含就返回原串
	//这里就只去掉最后的!，如果指定为!加空格，则后缀必须是"! "才能去掉
	//结果:"str hello "
	fmt.Println(strings.TrimSuffix(" str hello !", "!"))
}
